# python数据基础第十三节：数据分析
"""
    python数据基础第十三节：数据分析
        1、基本统计分析：a、计数；b、求和c、平均值；d、方差；e、标准差；
            describe()
             size       -->     计数
             sum        -->     求和
             mean       -->     均值
             var        -->     方差
             std        -->     标准差
        2、分组分析：是指根据分组字段，将分析对象划分成不同的部分，以进行对比分析各组之间的差异性的一种分析方法。a、计数（size），b、求和(sum)，c、平均值(mean)
            1、分组分析函数groupby()
            groupby(by=[分组列1，分组列2，...])[统计列1，统计列2，...].agg({统计列别名1:统计函数1,统计列别名2:统计函数2,...})
            by:用于分组的列
            中括号：用于统计的列
            agg：统计别名显示统计值得名称，统计函数用于统计数据

        3、 分布分析：
            pandas.cut(df4.年龄,bins,labels=labels)
        4、交叉分析：
            pivot_table(values,index,columns,aggfunc,fill_value)
                values: 数据透视表中的值
                index：数据透视表中的行
                columns:数据透视表中列
                aggfunc: 统计函数
                fill_value:NA值得统一替换
        5、结构分析
            指定按列或者按行计算：axis
                                0   ———》按列运算
                                1   ———》按行运算

            数据框内                    数据框外
            求和： sum              sum 求和
            减  ： sub              mean 平均值
            乘  ： multiply          var 方差
            除  ： div               sd  标准差
        6、相关分析：

            相关系数：绝对值
                0 <=|r|<3        --》     低度相关
                0.3 <=|r|<0.8    --》     中度相关
                0.8 <=|r|<=1     --》     高度相关

            DataFrame.corr()        --》 返回DataFrame
                数据框调用corr方法，那么将会计算每个列两两之间的相似度

            Series.corr(other)      --》 返回一个数值型，大小为相关度
                序列掉用corr方法，那么只是计算该序列与传入的序列之间的相关度

"""

from pandas import read_csv
import numpy
import pandas

# 基本分析
df1 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data17.csv")
# 查看统计值
df2 = df1.score.describe()
# 分开统计:最大值
max1 = df1.score.max()
# 最小值
min1 = df1.score.min()
# 总共的条数
size = df1.score.size
# 总和sum
sum1 = df1.score.sum()
# 平均值
mean = df1.score.mean()
# 方差
var1 = df1.score.var()
# 标准差
df1.score.std()

# 分组分析
df3 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data17.csv")
# 创建一个列，为score*2
df3["score2"] = df3["score"] * 2

# 按一个条件处理
resoult = df3.groupby(by=['class'])["score"].agg({
    "总分": numpy.sum,
    "人数": numpy.size,
    "平均值": numpy.mean,
    "方差": numpy.var,
    "标准差": numpy.std
})

# 返回分组的组名
suoyin = resoult.index
# 每组的平均值
mean1 = resoult["平均值"]
# 返回分组的列名
colimng2 = resoult.columns

# 按两个条件分组
resoult2 = df3.groupby(by=["class", "name"])[["score", "score2"]].agg([
    numpy.size,
    numpy.sum
])

# 返回分组的组名
suoyin2 = resoult2.index
# 返回分组的列名
colimng3 = resoult2.columns
# 查看分组之后score列
score1 = resoult2["score"]
# 查看分组之后的总和
sums = resoult2["score"]["sum"]
# 使用class当索引
class1 = resoult.reset_index()["class"]
class2 = resoult2.reset_index()["class"]

# 分布分析
df4 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data18.csv")
bins = [min(df4.年龄) - 1, 20, 30, 40, max(df4.年龄) + 1]
labels = ["20岁以下", "21岁到30岁", "31岁到40", "41岁以上"]
df4["年龄分层"] = pandas.cut(df4.年龄, bins, labels=labels)
# 查看最后年龄所属的分组情况
tongji = df4.groupby(by=["年龄分层"])["年龄"].agg({"人数": numpy.size})

# 交叉分析
df4 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data18.csv")
bins = [min(df4.年龄) - 1, 20, 30, 40, max(df4.年龄) + 1]
labels = ["20岁以下", "21岁到30岁", "31岁到40", "41岁以上"]
df4["年龄分层"] = pandas.cut(df4.年龄, bins, labels=labels)
# 查看年龄分层总性别男女的分布情况，及平均值
r1 = df4.pivot_table(
    values=["年龄"],
    index=["年龄分层"],
    columns=["性别"],
    aggfunc=[numpy.size, numpy.mean],
)

r2 = df4.pivot_table(
    values=["年龄"],
    index=["年龄分层"],
    columns=["性别"],
    aggfunc=[numpy.std],
)
# 将r2中的标准差写入r1中，生成新的数据框
r3 = r1.join(r2)


# 结构分析
df5 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data15.csv")
data_pt = df5.pivot_table(
    values=["月消费（元）"],
    index=["省份"],
    columns=["通信品牌"],
    aggfunc=[numpy.sum],
)
data_pt.sum()
data_pt.sum(axis=0)
data_pt.sum(axis=1)
data_pt.div(data_pt.sum(axis=1),axis=0)
data_pt.div(data_pt.sum(axis=0),axis=1)

df6 = read_csv("E:\\Python\\pyspark_demo01\\out_data\\data19.csv")
df6["人口"].corr(df6["文盲率"])

# 多列之间相关度的计算方法
# 选择多列的方法   df5.loc[:,["列1","列2"，...]]
df6.loc[:,["超市购物率","网上购物率","文盲率","人口"]].corr()

